#include "login.h"
#include "ui_login.h"
#include <QDebug>

login::login(QDialog *parent) :
    QDialog(parent), codec(QTextCodec::codecForName("UTF-8")), ui(new Ui::login)
{
    ui->setupUi(this);
}

login::~login()
{
    delete ui;
}

bool login::islegalInput(const QString& name, const QString& account, const QString& password)
{
    // 1. 检查输入是否为空
    if (name.isEmpty()) {
        QMessageBox::warning(this, "输入错误", "用户名不能为空！");
        return false;
    }

    if (account.isEmpty()) {
        QMessageBox::warning(this, "输入错误", "账户不能为空！");
        return false;
    }

    if (password.isEmpty()) {
        QMessageBox::warning(this, "输入错误", "密码不能为空！");
        return false;
    }

    // 2. 如果需要，可以添加更多验证逻辑，例如：
    // - 验证用户名、账户、密码的格式
    // - 验证账户是否已被注册
    // - 验证密码强度等

    // 3. 所有检查通过，返回 true
    return true;
}

// 判断用户是否存在（登录时）
bool login::_isUserExistForLogin(User& user) { // 文件版
    // 1. 读取用户表信息
    QString filePath = QCoreApplication::applicationDirPath() + "/files/login_users.txt"; // 用户表
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        // 文件打开失败
        QMessageBox::warning(this, "Error", "Unable to open file: " + filePath);
        return false;
    }
    // 按行提取用户信息
    QTextStream in(&file);
    in.setCodec(codec);
    StringUtil string_util;

    while (!in.atEnd()) {
        QString line = in.readLine();
        std::vector<QString> content;
        string_util.SplitString(line, content, ' ');

        if (content.size() == 3) {
            User stored_user;
            stored_user.name = content[0];
            stored_user.account = content[1];
            stored_user.password = content[2];

            if (stored_user.name == user.name && stored_user.account == user.account && stored_user.password == user.password) {
                file.close();
                return true;  // 用户存在
            }
        }
    }

    file.close();
    return false;  // 用户不存在
}


bool login::_isUserExistForRegistration(User& user, QString &errorMessage) {
    QString filePath = QCoreApplication::applicationDirPath() + "/files/login_users.txt"; // 用户表
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        // 文件打开失败
        QMessageBox::warning(nullptr, "Error", "Unable to open file: " + filePath);
        return false;
    }

    QTextStream in(&file);
    in.setCodec(codec);
    StringUtil string_util;

    while (!in.atEnd()) {
        QString line = in.readLine();
        std::vector<QString> content;
        string_util.SplitString(line, content, ' ');

        if (content.size() == 3) {
            User stored_user;
            stored_user.name = content[0];
            stored_user.account = content[1];
            stored_user.password = content[2];

            qDebug() << stored_user.name;

            if (stored_user.name == user.name) {
                file.close();
                errorMessage = "Username already exists.";
                return true; // 用户名重复
            } else if (stored_user.account == user.account) {
                file.close();
                errorMessage = "Account already exists.";
                return true; // 账户重复
            }
        }
    }

    file.close();
    return false; // 用户名和账户都不重复
}

// 登录: 判断用户是否存在
bool login::isUserExistForLogin(User& user) // MySql版
{
    // 1. 连接数据库
    SqlUtil su(su._host_name, su._database_name, su._user_name, su._password);
    su.connectMySql();

    // 2. 执行SQL查询
    QSqlQuery query;
    query.prepare("SELECT name, account, password FROM users WHERE name = :name AND account = :account AND password = :password");
    query.bindValue(":name", user.name);
    query.bindValue(":account", user.account);
    query.bindValue(":password", user.password);

    if (!query.exec()) {
        QMessageBox::warning(nullptr, "Error", "Unable to execute query at " + QString(__FILE__) + ":" + QString::number(__LINE__) + "\nError message: " + query.lastError().text());
        su.closeMySql();
        return false;
    }

    // 3. 处理查询结果
    bool userExists = false;
    if (query.next()) { // 如果有结果，说明用户存在
        userExists = true;
    }

    su.closeMySql();
    return userExists;

}

bool login::isUserExistForRegistration(User& user, QString &errorMessage)
{
    // 1. 连接数据库
    SqlUtil su(su._host_name, su._database_name, su._user_name, su._password);
    su.connectMySql();

    // 2. 执行SQL查询检查用户名是否存在
    QSqlQuery query;
    query.prepare("SELECT name FROM users WHERE name = :name");
    query.bindValue(":name", user.name);

    if (!query.exec()) {
        QMessageBox::warning(nullptr, "Error", "Unable to execute query at " + QString(__FILE__) + ":" + QString::number(__LINE__) + "\nError message: " + query.lastError().text());
        su.closeMySql();
        return false;
    }

    // 3. 处理查询结果
    if (query.next()) { // 如果有结果，说明用户名已存在
        errorMessage = "Username already exists.";
        su.closeMySql();
        return true;
    }

    // 4. 执行SQL查询检查账户是否存在
    query.prepare("SELECT account FROM users WHERE account = :account");
    query.bindValue(":account", user.account);

    if (!query.exec()) {
        QMessageBox::warning(nullptr, "Error", "Unable to execute query: " + query.lastError().text());
        su.closeMySql();
        return false;
    }

    if (query.next()) { // 如果有结果，说明账户已存在
        errorMessage = "Account already exists.";
        su.closeMySql();
        return true;
    }

    // 用户名和账户都不重复
    su.closeMySql();
    return false;
}

// 注册用户
bool login::_registerUser(User& user) { // 文件版
    QString filePath = QCoreApplication::applicationDirPath() + "/files/login_users.txt"; // 用户表
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
        // 文件打开失败
        QMessageBox::warning(nullptr, "Error", "Unable to open file: " + filePath);
        return false;
    }

    QTextStream out(&file);
    out << user.name << " " << user.account << " " << user.password << "\n";
    file.close();
    return true; // 用户注册成功
}

bool login::registerUser(User& user) { // MySql版
    // 1. 连接数据库
    SqlUtil su(su._host_name, su._database_name, su._user_name, su._password);
    su.connectMySql();

    // 2. 执行SQL插入语句将用户信息存储到数据库
    QSqlQuery query;
    query.prepare("INSERT INTO users (name, account, password) VALUES (:name, :account, :password)");
    query.bindValue(":name", user.name);
    query.bindValue(":account", user.account);
    query.bindValue(":password", user.password); // 假设password已经正确加密

    if (!query.exec()) {
        QMessageBox::warning(nullptr, "Error", "Unable to execute query at " + QString(__FILE__) + ":" + QString::number(__LINE__) + "\nError message: " + query.lastError().text());
        su.closeMySql();
        return false;
    }

    // 3. 关闭数据库连接
    su.closeMySql();
    return true; // 用户注册成功
}

bool login::showAllUsers()
{
    // 1. 连接数据库
    SqlUtil su(su._host_name, su._database_name, su._user_name, su._password);
    su.connectMySql();

    // 2. 执行SQL 获取所有用户内容
    QSqlQuery query;
    query.prepare("SELECT * FROM users");
    query.exec();

    if (!query.isActive()) {
        QMessageBox::warning(nullptr, "Error", "Failed to execute query: " + query.lastError().text());
        su.closeMySql();
        return false;
    }

    // 3. 以QMessageBox输出
    QString userInformation;
    while (query.next()) {
        QString name = query.value(0).toString();
        QString account = query.value(1).toString();
        QString password = query.value(2).toString(); // 注意：密码通常不应该直接显示在界面上，这里只是演示

        userInformation += "Name: " + name + ", Account: " + account + "\n";
    }

    QMessageBox::information(nullptr, "User Information", userInformation);

    // 4. 关闭数据库连接
    su.closeMySql();

    return true;
}

bool login::afterLogin()
{
    /*此时用户已经登录成功*/
    // 创建一个子窗口
    QDialog dialog;
    dialog.resize(300, 300);
    QPushButton *button = new QPushButton("显示所有用户", &dialog); // 将按钮添加到子窗口中
    button->setGeometry(50, 50, 200, 50); // 设置按钮的位置和大小

    // 连接按钮的点击事件到 showAllUsers 函数
    QObject::connect(button, &QPushButton::clicked, this, showAllUsers);

    dialog.exec(); // 以模态方式显示对话框

    return true;
}

// 登录
void login::on_pb_login_clicked()
{
    User user;
    // 1. 获取用户输入内容
    user.name = ui->lineEdit_username->text().trimmed();
    user.account = ui->lineEdit_account->text().trimmed();
    user.password = ui->lineEdit_password->text().trimmed();

    if(!islegalInput(user.name, user.account, user.password)) {
        return;
    }

    /* 2. 判断用户是否存在
    * 存在->成功登入页面
    * 不存在->报错
    */
    if (_isUserExistForLogin(user)) {
        QMessageBox::information(this, "Login Success", "You have successfully logged in!");
        // TODO...
        afterLogin();
    } else {
        QMessageBox::warning(this, "Login Failed", "User not exist.");
    }
}

void login::on_pb_register_clicked()
{
    User user;
    // 1. 获取用户输入内容
    user.name = ui->lineEdit_username->text().trimmed();
    user.account = ui->lineEdit_account->text().trimmed();
    user.password = ui->lineEdit_password->text().trimmed();

    if(!islegalInput(user.name, user.account, user.password)) {
        return;
    }

    QString errorMessage;
    if (_isUserExistForRegistration(user, errorMessage)) {
        QMessageBox::warning(this, "Registration Failed", errorMessage);
    } else {
        if(_registerUser(user))
            QMessageBox::information(this, "Registration Success", "You have successfully registered!");
        else
            QMessageBox::information(this, "用户信息合法", "但是用户注册失败！");
    }
}
